home *** CD-ROM | disk | FTP | other *** search
/ 10,000 Great Games / 10,000 Great Games.iso / Product / 66 / data1.cab / Source_Files / Src / Char.cpp < prev    next >
C/C++ Source or Header  |  2000-01-16  |  18KB  |  898 lines

  1. #include "stdafx.h"
  2.  
  3. cCharacter::cCharacter(cProperties *_orig)
  4.         : cGameObject(_orig)
  5. {
  6.     // Get animations
  7.     
  8.     orig->get_sequence("WALK LEFT", walk_left_seq);
  9.     orig->get_sequence("WALK RIGHT", walk_right_seq);
  10.     orig->get_sequence("WALK LEFT RIGHT", walk_left_right_seq);
  11.     orig->get_sequence("WALK FIRE LEFT", walk_fire_left_seq);
  12.     orig->get_sequence("WALK FIRE RIGHT", walk_fire_right_seq);
  13.     orig->get_sequence("WALK FIRE UP", walk_fire_up_seq);
  14.     
  15.     orig->get_sequence("JUMP LEFT", jump_left_seq);
  16.     orig->get_sequence("JUMP RIGHT", jump_right_seq);
  17.     orig->get_sequence("JUMP LEFT RIGHT", jump_left_right_seq);
  18.     orig->get_sequence("JUMP FIRE LEFT", jump_fire_left_seq);
  19.     orig->get_sequence("JUMP FIRE RIGHT", jump_fire_right_seq);
  20.     orig->get_sequence("JUMP FIRE UP LEFT", jump_fire_up_left_seq);
  21.     orig->get_sequence("JUMP FIRE UP RIGHT", jump_fire_up_right_seq);
  22.     
  23.     orig->get_sequence("DUCK LEFT", duck_left_seq);
  24.     orig->get_sequence("DUCK RIGHT", duck_right_seq);
  25.     orig->get_sequence("DUCK LEFT RIGHT", duck_left_right_seq);
  26.     orig->get_sequence("DUCK FIRE LEFT", duck_fire_left_seq);
  27.     orig->get_sequence("DUCK FIRE RIGHT", duck_fire_right_seq);
  28.     
  29.     orig->get_sequence("JET LEFT", jet_left_seq);
  30.     orig->get_sequence("JET RIGHT", jet_right_seq);
  31.     orig->get_sequence("JET LEFT RIGHT", jet_left_right_seq);
  32.     orig->get_sequence("JET FIRE LEFT", jet_fire_left_seq);
  33.     orig->get_sequence("JET FIRE RIGHT", jet_fire_right_seq);
  34.     orig->get_sequence("JET FIRE UP LEFT", jet_fire_up_left_seq);
  35.     orig->get_sequence("JET FIRE UP RIGHT", jet_fire_up_right_seq);
  36.     orig->get_sequence("JET ON LEFT", jet_on_left_seq);
  37.     orig->get_sequence("JET ON RIGHT", jet_on_right_seq);
  38.     orig->get_sequence("JET OFF LEFT", jet_off_left_seq);
  39.     orig->get_sequence("JET OFF RIGHT", jet_off_right_seq);
  40.     
  41.     orig->get_sequence("KICK LEFT", kick_left_seq);
  42.     orig->get_sequence("KICK RIGHT", kick_right_seq);
  43.     
  44.     orig->get_sequence("STUNNED", stunned_seq);
  45.     orig->get_sequence("CAPTURED", captured_seq);
  46.     orig->get_sequence("CLIMBING", climbing_seq);
  47.     
  48.     // Set boundaries
  49.     
  50.     orig->get_circles("STANDING", &bounds_standing);
  51.     orig->get_circles("DUCKED", &bounds_ducked);
  52.     
  53.     // Circles for kick
  54.     
  55.     orig->get_circles("KICK LEFT", &kick_left_circle);
  56.     orig->get_circles("KICK RIGHT", &kick_right_circle);
  57.     
  58.     // Set spots
  59.     
  60.     orig->get_spots("WALK FIRE LEFT", &walk_fire_left_spot);
  61.     orig->get_spots("WALK FIRE RIGHT", &walk_fire_right_spot);
  62.     orig->get_spots("WALK FIRE UP", &walk_fire_up_spot);
  63.     
  64.     orig->get_spots("JUMP FIRE LEFT", &jump_fire_left_spot);
  65.     orig->get_spots("JUMP FIRE RIGHT", &jump_fire_right_spot);
  66.     orig->get_spots("JUMP FIRE UP LEFT", &jump_fire_up_left_spot);
  67.     orig->get_spots("JUMP FIRE UP RIGHT", &jump_fire_up_right_spot);
  68.     
  69.     orig->get_spots("JET FIRE LEFT", &jet_fire_left_spot);
  70.     orig->get_spots("JET FIRE RIGHT", &jet_fire_right_spot);
  71.     orig->get_spots("JET FIRE UP LEFT", &jet_fire_up_left_spot);
  72.     orig->get_spots("JET FIRE UP RIGHT", &jet_fire_up_right_spot);
  73.     
  74.     orig->get_spots("DUCK FIRE LEFT", &duck_fire_left_spot);
  75.     orig->get_spots("DUCK FIRE RIGHT", &duck_fire_right_spot);
  76.     
  77.     orig->get_spots("FIRE DOWN", &fire_down_spot);
  78.     
  79.     // Get sounds
  80.     
  81.     orig->get_soundsequence("GOT HIT", snd_gothit);
  82.     
  83.     // Clear weapons
  84.     
  85.     weapon = 0;
  86.     weapon_down = 0;
  87.     
  88.     // Reset score counters
  89.     
  90.     deaths = 0;
  91.     stuns = 0;
  92.     shots_fired = 0;
  93.     
  94.     // Set text stuff
  95.  
  96.     text_above_char = new cText (&texts);
  97.     text_above_char->set_centered(TRUE);
  98.         
  99.     // Setup other variables
  100.  
  101.     influenced_by_catapult = TRUE;    
  102.     influenced_by_inpenetrable = TRUE;
  103.  
  104.     // Revive character and put it in a bubble
  105.  
  106.     revive();
  107.  
  108. void cCharacter::revive()
  109. {
  110.     // Set some variables
  111.     
  112.     stop_movement();
  113.     
  114.     ay = GRAVITY;
  115.     
  116.     armor = orig->params->get_int("*ARMOR", 100);
  117.     
  118.     ducked = FALSE;
  119.     circle_bounds = bounds_standing;
  120.     
  121.     standing = FALSE;
  122.     climbing = FALSE;
  123.     captured = 0;
  124.     
  125.     dead = FALSE;
  126.     
  127.     jetpack_active = FALSE;
  128.     jetpack_time = JETPACK_TIME;
  129.     
  130.     stunned = 0;
  131.     firing = 0;
  132.     ignore_platforms = 0;
  133.     next_stun_time = 2 * sec;
  134.     invulnerable = CHAR_INVULNERABLE;
  135.     
  136.     last_move = CHAR_LEFT;
  137.     horiz_speed = 0;
  138.     set_last_in_sequence(jump_left_seq);
  139.     
  140.     // Weapon is standard gun
  141.  
  142.     weapon->delete_list();
  143.     new cInventoryBullet(&weapon);
  144.     
  145.     weapon_down->delete_list();
  146. }
  147.  
  148. cCharacter::~cCharacter()
  149. {
  150.     // Delete weapons
  151.     
  152.     weapon->delete_list();
  153.     weapon_down->delete_list();
  154.     
  155.     // Delete boundaries
  156.     
  157.     bounds_standing->delete_list();
  158.     bounds_ducked->delete_list();
  159.     
  160.     // Delete circles
  161.     
  162.     kick_left_circle->delete_list();
  163.     kick_right_circle->delete_list();
  164.     
  165.     // Delete spots
  166.     
  167.     walk_fire_left_spot->delete_list();
  168.     walk_fire_right_spot->delete_list();
  169.     walk_fire_up_spot->delete_list();
  170.     
  171.     jump_fire_left_spot->delete_list();
  172.     jump_fire_right_spot->delete_list();
  173.     jump_fire_up_left_spot->delete_list();
  174.     jump_fire_up_right_spot->delete_list();
  175.     
  176.     duck_fire_left_spot->delete_list();
  177.     duck_fire_right_spot->delete_list();
  178.     
  179.     jet_fire_left_spot->delete_list();
  180.     jet_fire_right_spot->delete_list();
  181.     jet_fire_up_left_spot->delete_list();
  182.     jet_fire_up_right_spot->delete_list();
  183.     
  184.     fire_down_spot->delete_list();
  185.  
  186.     // Delete text
  187.  
  188.     delete text_above_char;
  189. }
  190.  
  191. void cCharacter::set_horiz_speed(int new_speed)
  192. {
  193.     // First substract old speed
  194.     
  195.     vx -= (fix)horiz_speed;
  196.     
  197.     // Add new speed
  198.     
  199.     vx += new_speed;
  200.     
  201.     // Remember new speed
  202.     
  203.     horiz_speed = new_speed;
  204. }
  205.  
  206. void cCharacter::walk_turn_left()
  207. {
  208.     if (last_move != CHAR_LEFT)
  209.         set_inverse_sequence(walk_left_right_seq);
  210.     
  211.     last_move = CHAR_LEFT;
  212. }
  213.  
  214. void cCharacter::walk_left()
  215. {
  216.     walk_turn_left();
  217.     
  218.     set_horiz_speed(-CHAR_WALK_SPEED);
  219. }
  220.  
  221. void cCharacter::walk_turn_right()
  222. {
  223.     if (last_move != CHAR_RIGHT)
  224.         set_sequence(walk_left_right_seq);
  225.     
  226.     last_move = CHAR_RIGHT;
  227. }
  228.  
  229. void cCharacter::walk_right()
  230. {
  231.     walk_turn_right();
  232.     
  233.     set_horiz_speed(CHAR_WALK_SPEED);
  234. }
  235.  
  236. void cCharacter::walk_h_halt()
  237. {
  238.     cAnimation c = get_sequence();
  239.     
  240.     if (c.start_frame == walk_left_seq.start_frame || c.start_frame == walk_right_seq.start_frame)
  241.         stop_animation();
  242.     
  243.     set_horiz_speed(0);
  244. }
  245.  
  246. void cCharacter::climb_turn_left()
  247. {
  248.     last_move = CHAR_LEFT;
  249. }
  250.  
  251. void cCharacter::climb_left()
  252. {
  253.     climb_turn_left();
  254.     
  255.     set_horiz_speed(-CHAR_CLIMB_SPEED);
  256. }
  257.  
  258. void cCharacter::climb_turn_right()
  259. {
  260.     last_move = CHAR_RIGHT;
  261. }
  262.  
  263. void cCharacter::climb_right()
  264. {
  265.     last_move = CHAR_RIGHT;
  266.     
  267.     set_horiz_speed(CHAR_CLIMB_SPEED);
  268. }
  269.  
  270. void cCharacter::climb_up()
  271. {
  272.     vy = CHAR_CLIMB_SPEED;
  273. }
  274.  
  275. void cCharacter::climb_down()
  276. {
  277.     vy = -CHAR_CLIMB_SPEED;
  278. }
  279.  
  280. void cCharacter::climb_h_halt()
  281. {
  282.     set_horiz_speed(0);
  283. }
  284.  
  285. void cCharacter::climb_v_halt()
  286.     vy = 0;
  287. }
  288.  
  289. void cCharacter::jet_on()
  290. {
  291.     if (!jetpack_active && jetpack_time > 0)
  292.     {
  293.         ay = 0;
  294.         vy = 0;
  295.         
  296.         jetpack_active = TRUE;
  297.         jetpack_timer = 0;
  298.         
  299.         set_sequence(last_move == CHAR_LEFT? jet_on_left_seq:jet_on_right_seq);
  300.     }
  301. }
  302.  
  303. void cCharacter::jet_off()
  304. {   
  305.     if (jetpack_active)
  306.     {
  307.         ay = GRAVITY;
  308.         
  309.         jetpack_active = FALSE;
  310.         
  311.         set_sequence(last_move == CHAR_LEFT? jet_off_left_seq:jet_off_right_seq);
  312.     }
  313. }
  314.  
  315. void cCharacter::jet_turn_left()
  316. {
  317.     if (last_move != CHAR_LEFT)
  318.         set_inverse_sequence(jet_left_right_seq);
  319.     
  320.     last_move = CHAR_LEFT;
  321. }
  322.  
  323. void cCharacter::jet_left()
  324. {
  325.     jet_turn_left();
  326.     
  327.     set_horiz_speed(-JETPACK_SPEED);
  328. }
  329.  
  330. void cCharacter::jet_turn_right()
  331. {
  332.     if (last_move != CHAR_RIGHT)
  333.         set_sequence(jet_left_right_seq);
  334.     
  335.     last_move = CHAR_RIGHT;
  336. }
  337.  
  338. void cCharacter::jet_right()
  339. {
  340.     jet_turn_right();
  341.     
  342.     set_horiz_speed(JETPACK_SPEED);
  343. }
  344.  
  345. void cCharacter::jet_up()
  346. {
  347.     vy = JETPACK_SPEED;
  348. }
  349.  
  350. void cCharacter::jet_down()
  351. {
  352.     vy = -JETPACK_SPEED;
  353. }
  354.  
  355. void cCharacter::jet_h_halt()
  356. {
  357.     set_horiz_speed(0);
  358. }
  359.  
  360. void cCharacter::jet_v_halt()
  361. {
  362.     vy = 0;
  363. }
  364.  
  365. void cCharacter::jump()
  366. {
  367.     stand();
  368.     
  369.     vy = CHAR_JUMP_SPEED;
  370.     
  371.     set_sequence(last_move == CHAR_LEFT? jump_left_seq:jump_right_seq);
  372. }
  373.  
  374. void cCharacter::jump_turn_left()
  375. {
  376.     if (last_move != CHAR_LEFT)
  377.         set_inverse_sequence(jump_left_right_seq);
  378.     
  379.     last_move = CHAR_LEFT;
  380. }
  381.  
  382. void cCharacter::jump_left()
  383. {
  384.     jump_turn_left();
  385.     
  386.     set_horiz_speed(-CHAR_WALK_SPEED);
  387. }
  388.  
  389. void cCharacter::jump_turn_right()
  390. {
  391.     if (last_move != CHAR_RIGHT)
  392.         set_sequence(jump_left_right_seq);
  393.     
  394.     last_move = CHAR_RIGHT;
  395. }
  396.  
  397. void cCharacter::jump_right()
  398. {
  399.     jump_turn_right();
  400.     
  401.     set_horiz_speed(CHAR_WALK_SPEED);
  402. }
  403.  
  404. void cCharacter::jump_h_halt()
  405. {
  406.     set_horiz_speed(0);
  407. }
  408.  
  409. void cCharacter::duck()
  410. {
  411.     if (standing && !ducked)
  412.     {
  413.         ducked = TRUE;
  414.         circle_bounds = bounds_ducked;
  415.         
  416.         set_horiz_speed(0);
  417.         
  418.         set_sequence(last_move == CHAR_LEFT? duck_left_seq:duck_right_seq);
  419.     }
  420. }
  421.  
  422. void cCharacter::duck_left()
  423. {
  424.     if (last_move != CHAR_LEFT)
  425.         set_inverse_sequence(duck_left_right_seq);
  426.     
  427.     last_move = CHAR_LEFT;
  428. }
  429.  
  430. void cCharacter::duck_right()
  431. {
  432.     if (last_move != CHAR_RIGHT)
  433.         set_sequence(duck_left_right_seq);
  434.     
  435.     last_move = CHAR_RIGHT;
  436. }
  437.  
  438. void cCharacter::stand()
  439. {
  440.     circle_bounds = bounds_standing;
  441.     
  442.     if (ducked)
  443.     {
  444.         ducked = FALSE;
  445.         
  446.         set_inverse_sequence(last_move == CHAR_LEFT? duck_left_seq:duck_right_seq);
  447.         add_last_in_sequence(last_move == CHAR_LEFT? walk_left_seq:walk_right_seq);
  448.     }
  449. }
  450.  
  451. void cCharacter::fire()
  452. {
  453.     cCharacter *ch;
  454.     cCircle *c;
  455.     
  456.     if (weapon == 0 || firing)
  457.         return;
  458.     
  459.     // Increase shots fired
  460.  
  461.     shots_fired++;
  462.     
  463.     // Check kick distance    
  464.  
  465.     c = last_move == CHAR_LEFT? kick_left_circle:kick_right_circle;
  466.     ch = (cCharacter *)check_radial_boundaries(c, players);    
  467.  
  468.     if (ch != 0 && captured == 0 && ch->captured == 0)
  469.     {
  470.         firing = CHAR_KICK_DLY;
  471.  
  472.         int was_active = ch->is_active();
  473.  
  474.         // Do kick and push
  475.  
  476.         ch->push(angle(c->x, 10), CHAR_KICK_POWER);
  477.         ch->hit(CHAR_KICK_APOWER);
  478.         
  479.         // Create effect and set animation
  480.         
  481.         new cEffect (x + c->x, y - c->y, orig, "KICK EFFECT");
  482.         set_sequence(last_move == CHAR_LEFT? kick_left_seq:kick_right_seq);
  483.  
  484.         // Award points if other character was active
  485.  
  486.         if (was_active)
  487.             modify_score(30 + (ch->is_active()? 0 : 50), ch);
  488.     }
  489.     else
  490.     {
  491.         firing = weapon->fire_delay;        
  492.         
  493.         if (last_move == CHAR_LEFT)
  494.         {
  495.             if (captured != 0)
  496.             {
  497.                 delete captured;
  498.             }
  499.             else if (jetpack_active)
  500.             {
  501.                 set_sequence(jet_fire_left_seq);
  502.                 weapon->fire(jet_fire_left_spot, x, y, 128, this);
  503.             }
  504.             else if (ducked)
  505.             {
  506.                 set_sequence(duck_fire_left_seq);
  507.                 weapon->fire(duck_fire_left_spot, x, y, 128, this);
  508.             }
  509.             else if (standing)
  510.             {
  511.                 set_sequence(walk_fire_left_seq);
  512.                 weapon->fire(walk_fire_left_spot, x, y, 128, this);
  513.             }
  514.             else
  515.             {
  516.                 set_sequence(jump_fire_left_seq);
  517.                 weapon->fire(jump_fire_left_spot, x, y, 128, this);
  518.             }
  519.         }
  520.         else
  521.         {
  522.             if (captured != 0)
  523.             {
  524.                 delete captured;
  525.             }
  526.             else if (jetpack_active)
  527.             {
  528.                 set_sequence(jet_fire_right_seq);
  529.                 weapon->fire(jet_fire_right_spot, x, y, 0, this);
  530.             }
  531.             else if (ducked)
  532.             {
  533.                 set_sequence(duck_fire_right_seq);
  534.                 weapon->fire(duck_fire_right_spot, x, y, 0, this);
  535.             }
  536.             else if (standing)
  537.             {
  538.                 set_sequence(walk_fire_right_seq);
  539.                 weapon->fire(walk_fire_right_spot, x, y, 0, this);
  540.             }
  541.             else
  542.             {
  543.                 set_sequence(jump_fire_right_seq);
  544.                 weapon->fire(jump_fire_right_spot, x, y, 0, this);
  545.             }
  546.         }
  547.     }
  548. }
  549.  
  550. void cCharacter::fire_up()
  551. {
  552.     if (weapon == 0 || firing)
  553.         return;
  554.     
  555.     // Increase shots fired
  556.  
  557.     shots_fired++;
  558.     
  559.     // Make sure we're standing
  560.  
  561.     stand();
  562.  
  563.     // Fire
  564.     
  565.     firing = weapon->fire_delay;
  566.     
  567.     if (captured != 0)
  568.     {
  569.         delete captured;
  570.     }
  571.     else if (jetpack_active)
  572.     {
  573.         set_sequence(last_move == CHAR_LEFT? jet_fire_up_left_seq:jet_fire_up_right_seq);
  574.         weapon->fire(last_move == CHAR_LEFT? jet_fire_up_left_spot:jet_fire_up_right_spot, x, y, 64, this);
  575.     }
  576.     else if (standing)
  577.     {
  578.         set_sequence(walk_fire_up_seq);
  579.         weapon->fire(walk_fire_up_spot, x, y, 64, this);
  580.     }
  581.     else
  582.     {
  583.         set_sequence(last_move == CHAR_LEFT? jump_fire_up_left_seq:jump_fire_up_right_seq);
  584.         weapon->fire(last_move == CHAR_LEFT? jump_fire_up_left_spot:jump_fire_up_right_spot, x, y, 64, this);
  585.     }
  586. }
  587.  
  588. void cCharacter::fire_down()
  589. {
  590.     if (weapon_down == 0 || firing)
  591.         return;
  592.  
  593.     // Increase shots fired
  594.  
  595.     shots_fired++;
  596.         
  597.     // Fire down
  598.  
  599.     firing = weapon_down->fire_delay;
  600.     
  601.     if (captured != 0)
  602.     {
  603.         delete captured;
  604.     }
  605.     else
  606.     {
  607.         weapon_down->fire(fire_down_spot, x, y, -64, this);
  608.     }
  609. }
  610.  
  611. void cCharacter::hit(int armor_power)
  612. {
  613.     // If already dead do nothing
  614.     
  615.     if (dead)
  616.         return;
  617.     
  618.     // Auch!
  619.     
  620.     set_soundsequence(snd_gothit);
  621.     
  622.     // Impossible to hit?
  623.     
  624.     if (stunned || invulnerable || captured != 0)
  625.         return;
  626.     
  627.     // Substract value from armor
  628.     
  629.     armor -= armor_power;
  630.     
  631.     // Put remaining armor above player
  632.     
  633.     if (armor_power > 0)
  634.         set_text_above(construct("%d%%", armor <= 0? 0:armor), sec);
  635.     
  636.     // Stun if no armor left
  637.     
  638.     if (armor <= 0)
  639.     {
  640.         stuns++;
  641.  
  642.         modify_score(-50);
  643.  
  644.         stunned = next_stun_time;
  645.         invulnerable = next_stun_time + CHAR_INVULNERABLE;
  646.         
  647.         make_dirty();
  648.         
  649.         stand();
  650.         jet_off();
  651.         
  652.         set_horiz_speed(0);
  653.         ay = GRAVITY;
  654.         
  655.         set_sequence(stunned_seq);
  656.         
  657.         make_dirty();
  658.         
  659.         next_stun_time += sec / 2;
  660.         
  661.         armor = orig->params->get_int("*ARMOR", 100);
  662.     }
  663. }
  664.  
  665. void cCharacter::push(fix dir, int distance, fix speed, int ignore)
  666.     // Check if dead
  667.     
  668.     if (dead || captured != 0)
  669.         return;  
  670.     
  671.     if (distance != 0)
  672.         new_angular_push((fix)0.5, vpush_tx((fix)0.5, distance), apush_tx((fix)0.5, distance), dir);
  673.     
  674.     if (speed != (fix)0)
  675.         add_angular_speed(speed - get_speed(dir), dir);
  676.     
  677.     if (ignore > 0)
  678.         ignore_platforms = ignore;
  679. }
  680.  
  681. void cCharacter::capture(cBubble *captor)
  682. {
  683.     if (captured == 0)
  684.     {
  685.         captured = captor;
  686.         
  687.         stand();
  688.         jet_off();
  689.         
  690.         stop_movement();
  691.         
  692.         set_sequence(captured_seq);
  693.     }
  694. }
  695.  
  696. void cCharacter::release()
  697. {
  698.     if (captured != 0)
  699.     {
  700.         captured = 0;
  701.         
  702.         ay = GRAVITY;
  703.         
  704.         set_animation();
  705.     }
  706. }
  707.  
  708. void cCharacter::set_text_above(char *text, int time)
  709. {
  710.     text_above_char->make_dirty();
  711.     text_above_char->set_text(text);
  712.     text_above_char->set_position(x, y + CHAR_TEXT_DISTANCE);
  713.     text_above_char->make_dirty();
  714.     
  715.     keep_showing_text = time;
  716. }
  717.  
  718. void cCharacter::kill_text_above()
  719. {
  720.     text_above_char->make_dirty();
  721.     text_above_char->set_text(0);
  722. }
  723.  
  724. void cCharacter::update_text_above()
  725. {
  726.     if (keep_showing_text)
  727.     {
  728.         text_above_char->make_dirty();
  729.         text_above_char->set_position(x, y + CHAR_TEXT_DISTANCE);
  730.         text_above_char->make_dirty();
  731.     }
  732.     else
  733.     {
  734.         kill_text_above();
  735.     }
  736. }
  737.  
  738. void cCharacter::set_animation()
  739. {
  740.     if (stunned)
  741.     {
  742.         set_last_in_sequence(stunned_seq);
  743.     }
  744.     else if (captured != 0)
  745.     {
  746.         set_sequence(captured_seq);
  747.     }
  748.     else if (jetpack_active)
  749.     {
  750.         set_sequence(last_move == CHAR_RIGHT? jet_right_seq:jet_left_seq);
  751.     }
  752.     else if (climbing)
  753.     {
  754.         if (abs(vx) > (fix)1 || vy > (fix)1)
  755.             set_sequence(climbing_seq);
  756.         else if (vy < (fix)-1)
  757.             set_inverse_sequence(climbing_seq);
  758.         else
  759.             set_last_in_sequence(climbing_seq);
  760.     }
  761.     else if (ducked)
  762.     {
  763.         set_last_in_sequence(last_move == CHAR_RIGHT? duck_right_seq:duck_left_seq);
  764.     }
  765.     else if (standing)
  766.     {
  767.         if (abs(vx) > (fix)1)
  768.             set_sequence(last_move == CHAR_RIGHT? walk_right_seq:walk_left_seq);
  769.         else
  770.             set_last_in_sequence(last_move == CHAR_RIGHT? walk_right_seq:walk_left_seq);
  771.     }
  772.     else
  773.         set_last_in_sequence(last_move == CHAR_RIGHT? jump_right_seq:jump_left_seq);
  774. }
  775.  
  776. int cCharacter::control()
  777. {
  778.     cGameObject::control();
  779.     
  780.     // Check if we're dead/dying
  781.     
  782.     if (dead)
  783.     {
  784.         set_image(0);
  785.         set_position(x, surface->start);
  786.         stop_movement();
  787.         kill_text_above();
  788.         
  789.         return dead_timer;
  790.     }
  791.     
  792.     // Check if we're captured by something
  793.     
  794.     if (captured != 0)
  795.     {
  796.         if (animation_done())
  797.             set_sequence(captured_seq);
  798.  
  799.         stop_movement();
  800.         
  801.         update_text_above();
  802.         
  803.         return TRUE;
  804.     }
  805.     
  806.     // Set transparent if invulnerable
  807.     
  808.     set_colormap(invulnerable && !stunned? cmap_gray:0);
  809.     
  810.     // Check inpenetrable walls
  811.     
  812.     check_radial_boundaries(circle_bounds, structures, cStructure::check_inpenetrable);
  813.  
  814.     // Do jetpack stuff
  815.     
  816.     if (jetpack_active)
  817.     {
  818.         jetpack_time -= jetpack_timer.raw_delta();
  819.         
  820.         if (jetpack_time <= 0)
  821.         {
  822.             jetpack_time = 0;
  823.             
  824.             jet_off();
  825.         }
  826.     }
  827.     
  828.     // Check if character is on stairs
  829.     
  830.     int was_climbing = climbing;
  831.     
  832.     climbing = !ignore_platforms && is_active() && !jetpack_active
  833.         && check_radial_boundaries(circle_bounds, stairs) != 0;
  834.     
  835.     if (was_climbing && !climbing && vy == (fix)CHAR_CLIMB_SPEED)
  836.         vy = CHAR_JUMP_SPEED;
  837.     
  838.     if ((was_climbing && !climbing) || (!was_climbing && climbing))
  839.         stop_animation();
  840.     
  841.     // Check if character landed
  842.     
  843.     standing = !ignore_platforms && !jetpack_active && !climbing
  844.                && check_resting_on_boundaries(line_bounds, structures);
  845.     
  846.     if (standing)
  847.         vy = 0;
  848.     else
  849.         stand(); 
  850.     
  851.     // Adjust vertical motion
  852.         
  853.     if (climbing || jetpack_active)
  854.         ay = 0;
  855.     else
  856.         ay = GRAVITY;
  857.  
  858.     // Adjust horizontal motion
  859.  
  860.     ax = 0;
  861.     
  862.     if (!x_on_screen())
  863.         horiz_speed = 0, vx = 0;
  864.     else if (!is_x_pushed())
  865.         vx = horiz_speed;
  866.     
  867.     // Animate
  868.     
  869.     if (animation_done())
  870.         set_animation();
  871.     
  872.     // Set bounds
  873.     
  874.     circle_bounds = !stunned && !ducked? bounds_standing:bounds_ducked;
  875.     
  876.     // Die ?
  877.     
  878.     if (in_water())
  879.     { 
  880.         dead = TRUE;
  881.         dead_timer = 3 * sec;
  882.  
  883.         armor = 0;
  884.         circle_bounds = 0;
  885.         
  886.         deaths++;
  887.  
  888.         modify_score(-200);
  889.     }
  890.     
  891.     update_text_above();
  892.     
  893.     return TRUE;
  894. }
  895.